package thread.ch04;

import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * VisualComponent
 * <p/>
 * Delegating thread safety to multiple underlying state variables
 * <p />
 * VisualComponent中鼠标事件的监听器与键盘事件的监听器之间没有关系；它们彼此独立，
 * 因此VisualComponent可以将它的线程安全委托到了这两个线程的清单上。 VisualComponent
 * 中，不但每个List是线程安全的，而且不存在哪个不变约束会增加一个状态与另一个状态间的耦合。
 * @author Edgar Zhang
 * 
 */
public class VisualComponent {

	private final List<KeyListener> keyListeners = new CopyOnWriteArrayList<KeyListener>();
	private final List<MouseListener> mouseListeners = new CopyOnWriteArrayList<MouseListener>();

	public void addKeyListener(KeyListener listener) {
		keyListeners.add(listener);
	}

	public void addMouseListener(MouseListener listener) {
		mouseListeners.add(listener);
	}

	public void removeKeyListener(KeyListener listener) {
		keyListeners.remove(listener);
	}

	public void removeMouseListener(MouseListener listener) {
		mouseListeners.remove(listener);
	}
}
